package com.hzjh.base.web.util

import android.content.Context
import android.content.res.Resources
import android.os.Build
import android.util.Log
import android.webkit.WebSettings
import android.webkit.WebView
import com.blankj.utilcode.util.ProcessUtils
import com.hzjh.base.web.process.BridgeInvokeDispatcher
import kotlin.math.min

object WebUtil {
    private const val TAG="GuangWebView"
    fun defaultSettings(mWebSettings: WebSettings) {
        mWebSettings.setSupportZoom(false)
        mWebSettings.builtInZoomControls = false
        mWebSettings.displayZoomControls=false
        mWebSettings.defaultTextEncodingName = "utf-8"
        mWebSettings.javaScriptEnabled=true
        mWebSettings.textZoom = 100
        mWebSettings.layoutAlgorithm = WebSettings.LayoutAlgorithm.NORMAL
        mWebSettings.setGeolocationEnabled(true) //允许访问地址
        //加载https的兼容
        mWebSettings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
        //是否支持自动加载图片
        mWebSettings.loadsImagesAutomatically = true
        mWebSettings.blockNetworkImage=false
        //设置WebView是否通过手势触发播放媒体，默认是true，需要手势触发，false自动播放
        mWebSettings.mediaPlaybackRequiresUserGesture = false
        mWebSettings.supportMultipleWindows()//多窗口
        // 是否支持通过js打开新窗口
        mWebSettings.javaScriptCanOpenWindowsAutomatically=true
        //设置可以访问文件
        mWebSettings.allowContentAccess=true
        mWebSettings.allowFileAccessFromFileURLs=true
        mWebSettings.allowFileAccess=true
        // 解决兼容显示问题
        mWebSettings.useWideViewPort=true
        mWebSettings.loadWithOverviewMode=true

        mWebSettings.domStorageEnabled=true
        mWebSettings.databaseEnabled=true
        //LOAD_CACHE_ONLY: 不发网络请求资源，只读取缓存。
        //LOAD_DEFAULT根据cache-control或者Last-Modified决定是否从网络上取数据。默认采用该方案
        //LOAD_NO_CACHE: 不使用缓存，只从网络获取数据。
        //LOAD_CACHE_ELSE_NETWORK:只要本地有，无论是否过期，或者no-cache，都使用缓存中的数据。本地没有缓存时才从网络上获取。
        mWebSettings.cacheMode=WebSettings.LOAD_DEFAULT
    }

    /**
     * 初始化webView缓存池
     */
    fun initWebViewPool(context: Context,ifProcess:Boolean=false) {
        // 根据手机 CPU 核心数（或者手机内存）设置缓存池容量
        //启用web进程
        WebLog.d(TAG, "initWebViewPool 当前进程：${ProcessUtils.getCurrentProcessName()}")
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                val packageName = context.packageName
                WebView.setDataDirectorySuffix(packageName)
            }
        }catch (e:Exception){
            Log.e("initWebViewPool","${e.message}")
        }
        JHWebViewPool.getInstance()
            .setMaxPoolSize(min(Runtime.getRuntime().availableProcessors(), 3))
        JHWebViewPool.getInstance().init(context)
        //预加载缓存初始化
        WebCacheUtil.init()
        if(ifProcess) {
            WebLog.d(TAG, "----initProcess----")
            //跨进程时使用
            BridgeInvokeDispatcher.getInstance().bindService()
        }
    }

    fun isEmpty(value: String?): Boolean {
        return !(value != null && !"".equals(
            value.trim { it <= ' ' },
            ignoreCase = true
        ) && !"null".equals(value.trim { it <= ' ' }, ignoreCase = true))
    }

    fun px2dip(px: Int,context:Context): Float {
        val density: Float = context.resources
            .displayMetrics.density
        return px / density
    }
    fun getStatusBarHeight(): Int {
        val resources = Resources.getSystem()
        val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
        return resources.getDimensionPixelSize(resourceId)
    }
}